/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.cggveritas.crewintranet.jms.dao.jpacontroller;

import fr.cggveritas.crewintranet.jms.dao.jpacontroller.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fr.cggveritas.crewintranet.jms.entities.CvListeposte;
import fr.cggveritas.crewintranet.jms.entities.CvPosteoccupe;
import fr.cggveritas.crewintranet.jms.entities.CvTravailleur;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Alassane
 */
public class CvPosteoccupeJpaController extends DaoImp implements Serializable {

    public CvPosteoccupeJpaController() {
        super();
    }

    public void create(CvPosteoccupe cvPosteoccupe) {
        if (cvPosteoccupe.getCvTravailleurList() == null) {
            cvPosteoccupe.setCvTravailleurList(new ArrayList<CvTravailleur>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            CvListeposte cvListeposteIdposte = cvPosteoccupe.getCvListeposteIdposte();
            if (cvListeposteIdposte != null) {
                cvListeposteIdposte = em.getReference(cvListeposteIdposte.getClass(), cvListeposteIdposte.getIdposte());
                cvPosteoccupe.setCvListeposteIdposte(cvListeposteIdposte);
            }
            List<CvTravailleur> attachedCvTravailleurList = new ArrayList<CvTravailleur>();
            for (CvTravailleur cvTravailleurListCvTravailleurToAttach : cvPosteoccupe.getCvTravailleurList()) {
                cvTravailleurListCvTravailleurToAttach = em.getReference(cvTravailleurListCvTravailleurToAttach.getClass(), cvTravailleurListCvTravailleurToAttach.getId());
                attachedCvTravailleurList.add(cvTravailleurListCvTravailleurToAttach);
            }
            cvPosteoccupe.setCvTravailleurList(attachedCvTravailleurList);
            em.persist(cvPosteoccupe);
            if (cvListeposteIdposte != null) {
                cvListeposteIdposte.getCvPosteoccupeList().add(cvPosteoccupe);
                cvListeposteIdposte = em.merge(cvListeposteIdposte);
            }
            for (CvTravailleur cvTravailleurListCvTravailleur : cvPosteoccupe.getCvTravailleurList()) {
                CvPosteoccupe oldCvPosteoccupeIdposteoccupeOfCvTravailleurListCvTravailleur = cvTravailleurListCvTravailleur.getCvPosteoccupeIdposteoccupe();
                cvTravailleurListCvTravailleur.setCvPosteoccupeIdposteoccupe(cvPosteoccupe);
                cvTravailleurListCvTravailleur = em.merge(cvTravailleurListCvTravailleur);
                if (oldCvPosteoccupeIdposteoccupeOfCvTravailleurListCvTravailleur != null) {
                    oldCvPosteoccupeIdposteoccupeOfCvTravailleurListCvTravailleur.getCvTravailleurList().remove(cvTravailleurListCvTravailleur);
                    oldCvPosteoccupeIdposteoccupeOfCvTravailleurListCvTravailleur = em.merge(oldCvPosteoccupeIdposteoccupeOfCvTravailleurListCvTravailleur);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(CvPosteoccupe cvPosteoccupe) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            CvPosteoccupe persistentCvPosteoccupe = em.find(CvPosteoccupe.class, cvPosteoccupe.getIdposteoccupe());
            CvListeposte cvListeposteIdposteOld = persistentCvPosteoccupe.getCvListeposteIdposte();
            CvListeposte cvListeposteIdposteNew = cvPosteoccupe.getCvListeposteIdposte();
            List<CvTravailleur> cvTravailleurListOld = persistentCvPosteoccupe.getCvTravailleurList();
            List<CvTravailleur> cvTravailleurListNew = cvPosteoccupe.getCvTravailleurList();
            if (cvListeposteIdposteNew != null) {
                cvListeposteIdposteNew = em.getReference(cvListeposteIdposteNew.getClass(), cvListeposteIdposteNew.getIdposte());
                cvPosteoccupe.setCvListeposteIdposte(cvListeposteIdposteNew);
            }
            List<CvTravailleur> attachedCvTravailleurListNew = new ArrayList<CvTravailleur>();
            for (CvTravailleur cvTravailleurListNewCvTravailleurToAttach : cvTravailleurListNew) {
                cvTravailleurListNewCvTravailleurToAttach = em.getReference(cvTravailleurListNewCvTravailleurToAttach.getClass(), cvTravailleurListNewCvTravailleurToAttach.getId());
                attachedCvTravailleurListNew.add(cvTravailleurListNewCvTravailleurToAttach);
            }
            cvTravailleurListNew = attachedCvTravailleurListNew;
            cvPosteoccupe.setCvTravailleurList(cvTravailleurListNew);
            cvPosteoccupe = em.merge(cvPosteoccupe);
            if (cvListeposteIdposteOld != null && !cvListeposteIdposteOld.equals(cvListeposteIdposteNew)) {
                cvListeposteIdposteOld.getCvPosteoccupeList().remove(cvPosteoccupe);
                cvListeposteIdposteOld = em.merge(cvListeposteIdposteOld);
            }
            if (cvListeposteIdposteNew != null && !cvListeposteIdposteNew.equals(cvListeposteIdposteOld)) {
                cvListeposteIdposteNew.getCvPosteoccupeList().add(cvPosteoccupe);
                cvListeposteIdposteNew = em.merge(cvListeposteIdposteNew);
            }
            for (CvTravailleur cvTravailleurListOldCvTravailleur : cvTravailleurListOld) {
                if (!cvTravailleurListNew.contains(cvTravailleurListOldCvTravailleur)) {
                    cvTravailleurListOldCvTravailleur.setCvPosteoccupeIdposteoccupe(null);
                    cvTravailleurListOldCvTravailleur = em.merge(cvTravailleurListOldCvTravailleur);
                }
            }
            for (CvTravailleur cvTravailleurListNewCvTravailleur : cvTravailleurListNew) {
                if (!cvTravailleurListOld.contains(cvTravailleurListNewCvTravailleur)) {
                    CvPosteoccupe oldCvPosteoccupeIdposteoccupeOfCvTravailleurListNewCvTravailleur = cvTravailleurListNewCvTravailleur.getCvPosteoccupeIdposteoccupe();
                    cvTravailleurListNewCvTravailleur.setCvPosteoccupeIdposteoccupe(cvPosteoccupe);
                    cvTravailleurListNewCvTravailleur = em.merge(cvTravailleurListNewCvTravailleur);
                    if (oldCvPosteoccupeIdposteoccupeOfCvTravailleurListNewCvTravailleur != null && !oldCvPosteoccupeIdposteoccupeOfCvTravailleurListNewCvTravailleur.equals(cvPosteoccupe)) {
                        oldCvPosteoccupeIdposteoccupeOfCvTravailleurListNewCvTravailleur.getCvTravailleurList().remove(cvTravailleurListNewCvTravailleur);
                        oldCvPosteoccupeIdposteoccupeOfCvTravailleurListNewCvTravailleur = em.merge(oldCvPosteoccupeIdposteoccupeOfCvTravailleurListNewCvTravailleur);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = cvPosteoccupe.getIdposteoccupe();
                if (findCvPosteoccupe(id) == null) {
                    throw new NonexistentEntityException("The cvPosteoccupe with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            CvPosteoccupe cvPosteoccupe;
            try {
                cvPosteoccupe = em.getReference(CvPosteoccupe.class, id);
                cvPosteoccupe.getIdposteoccupe();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The cvPosteoccupe with id " + id + " no longer exists.", enfe);
            }
            CvListeposte cvListeposteIdposte = cvPosteoccupe.getCvListeposteIdposte();
            if (cvListeposteIdposte != null) {
                cvListeposteIdposte.getCvPosteoccupeList().remove(cvPosteoccupe);
                cvListeposteIdposte = em.merge(cvListeposteIdposte);
            }
            List<CvTravailleur> cvTravailleurList = cvPosteoccupe.getCvTravailleurList();
            for (CvTravailleur cvTravailleurListCvTravailleur : cvTravailleurList) {
                cvTravailleurListCvTravailleur.setCvPosteoccupeIdposteoccupe(null);
                cvTravailleurListCvTravailleur = em.merge(cvTravailleurListCvTravailleur);
            }
            em.remove(cvPosteoccupe);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<CvPosteoccupe> findCvPosteoccupeEntities() {
        return findCvPosteoccupeEntities(true, -1, -1);
    }

    public List<CvPosteoccupe> findCvPosteoccupeEntities(int maxResults, int firstResult) {
        return findCvPosteoccupeEntities(false, maxResults, firstResult);
    }

    private List<CvPosteoccupe> findCvPosteoccupeEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(CvPosteoccupe.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public CvPosteoccupe findCvPosteoccupe(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(CvPosteoccupe.class, id);
        } finally {
            em.close();
        }
    }

    public int getCvPosteoccupeCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<CvPosteoccupe> rt = cq.from(CvPosteoccupe.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
